package com.zenithmind.library.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.common.result.PageResult;
import com.zenithmind.common.result.Result;
import com.zenithmind.library.pojo.domain.Publisher;
import com.zenithmind.library.pojo.dto.PublisherCreateDTO;
import com.zenithmind.library.pojo.dto.PublisherUpdateDTO;
import com.zenithmind.library.pojo.query.PublisherQuery;
import com.zenithmind.library.pojo.vo.PublisherVO;

import java.util.List;

/**
 * 出版社服务接口
 * 
 * @author ZenithMind
 * @since 2024-06-14
 */
public interface PublisherService extends IService<Publisher> {

    /**
     * 分页查询出版社
     * 
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<PublisherVO> getPublisherPage(PublisherQuery query);

    /**
     * 根据ID获取出版社详情
     * 
     * @param id 出版社ID
     * @return 出版社详情
     */
    PublisherVO getPublisherDetail(String id);

    /**
     * 创建出版社
     * 
     * @param createDTO 创建DTO
     * @return 创建结果
     */
    Result<PublisherVO> createPublisher(PublisherCreateDTO createDTO);

    /**
     * 更新出版社
     * 
     * @param id 出版社ID
     * @param updateDTO 更新DTO
     * @return 更新结果
     */
    Result<PublisherVO> updatePublisher(String id, PublisherUpdateDTO updateDTO);

    /**
     * 删除出版社
     * 
     * @param id 出版社ID
     * @return 删除结果
     */
    Result<Void> deletePublisher(String id);

    /**
     * 批量删除出版社
     * 
     * @param ids 出版社ID列表
     * @return 删除结果
     */
    Result<Void> batchDeletePublishers(List<String> ids);

    /**
     * 启用出版社
     * 
     * @param id 出版社ID
     * @return 操作结果
     */
    Result<Void> enablePublisher(String id);

    /**
     * 禁用出版社
     * 
     * @param id 出版社ID
     * @return 操作结果
     */
    Result<Void> disablePublisher(String id);

    /**
     * 根据名称查询出版社
     * 
     * @param name 出版社名称
     * @return 出版社列表
     */
    List<PublisherVO> getPublishersByName(String name);

    /**
     * 根据编码查询出版社
     * 
     * @param code 出版社编码
     * @return 出版社信息
     */
    PublisherVO getPublisherByCode(String code);

    /**
     * 搜索出版社
     * 
     * @param keyword 关键词
     * @param limit 限制数量
     * @return 出版社列表
     */
    List<PublisherVO> searchPublishers(String keyword, Integer limit);

    /**
     * 获取热门出版社
     * 
     * @param limit 限制数量
     * @return 热门出版社列表
     */
    List<PublisherVO> getHotPublishers(Integer limit);

    /**
     * 根据国家查询出版社
     * 
     * @param country 国家
     * @return 出版社列表
     */
    List<PublisherVO> getPublishersByCountry(String country);

    /**
     * 根据城市查询出版社
     * 
     * @param city 城市
     * @return 出版社列表
     */
    List<PublisherVO> getPublishersByCity(String city);

    /**
     * 更新出版社图书数量
     * 
     * @param publisherId 出版社ID
     * @return 更新结果
     */
    Result<Void> updatePublisherBookCount(String publisherId);

    /**
     * 增加出版社图书数量
     * 
     * @param publisherId 出版社ID
     * @return 更新结果
     */
    Result<Void> incrementPublisherBookCount(String publisherId);

    /**
     * 减少出版社图书数量
     * 
     * @param publisherId 出版社ID
     * @return 更新结果
     */
    Result<Void> decrementPublisherBookCount(String publisherId);

    /**
     * 检查出版社编码是否存在
     * 
     * @param code 出版社编码
     * @param excludeId 排除的ID
     * @return 是否存在
     */
    boolean existsByCode(String code, String excludeId);

    /**
     * 检查出版社名称是否存在
     * 
     * @param name 出版社名称
     * @param excludeId 排除的ID
     * @return 是否存在
     */
    boolean existsByName(String name, String excludeId);

    /**
     * 导入出版社数据
     * 
     * @param publishers 出版社列表
     * @return 导入结果
     */
    Result<String> importPublishers(List<PublisherCreateDTO> publishers);

    /**
     * 导出出版社数据
     * 
     * @param query 查询条件
     * @return 导出文件路径
     */
    Result<String> exportPublishers(PublisherQuery query);
}
